3.5 Docker私有仓库的搭建与使用

和Maven一样,Docker不仅提供了一个中央仓库,同时也允许我们搭建私有仓库。如果读者对Maven有所了解,将会很容易理解私有仓库的优势:

  • 节省带宽,镜像无需从中央仓库下载,只需从私有仓库中下载即可
  • 对于私有仓库中已有的镜像,提升了下载速度
  • 便于内部镜像的统一管理

下面我们来讲解一下如何搭建、使用私有仓库

准备工作

准备两台安装有Docker的CentOS7的机器,主机规划如下(仅供参考):

主机 IP 角色
node0 192.168.11.143 Docker开发机
node1 192.168.11.144 Docker私有仓库

安装、使用私有仓库

网上有很多docker-registry 的教程,但是docker-registry 已经过时,并且已经2年不维护了。详见https://github.com/docker/docker-registry ,故而本文不做探讨,对docker-registry 有兴趣的童鞋可以查阅本节的参考文档。

本节讲解registry V2,registry V2需要Docker版本高于1.6.0。registry V2要求使用https访问,那么我们先做一些准备,为了方便,这边模拟以域名reg.itmuch.com 进行讲解。

使用域名搭建https的私有仓库

  • 首先修改两台机器的hosts,配置192.168.11.144reg.itmuch.com 的映射
  1. echo '192.168.11.144 reg.itmuch.com'>> /etc/hosts
  • 既然使用https,那么我们需要生成证书,本文讲解的是使用openssl自签名证书,当然也可以使用诸如Let’s Encrypt 等工具生成证书,首先在node1机器上生成key:
  1. mkdir -p ~/certs
  2. cd ~/certs
  3. openssl genrsa -out reg.itmuch.com.key 2048

再生成密钥文件:

  1. openssl req -newkey rsa:4096 -nodes -sha256 -keyout reg.itmuch.com.key -x509 -days 365 -out reg.itmuch.com.crt

会有一些信息需要填写:

  1. Country Name (2 letter code) [XX]:CN # 你的国家名称
  2. State or Province Name (full name) []:JS # 省份
  3. Locality Name (eg, city) [Default City]:NJ # 所在城市
  4. Organization Name (eg, company) [Default Company Ltd]:ITMUCH # 组织名称
  5. Organizational Unit Name (eg, section) []:ITMUCH # 组织单元名称
  6. Common Name (eg, your name or your server's hostname) []:reg.itmuch.com # 域名
  7. Email Address []:eacdy0000@126.com # 邮箱

这样自签名证书就制作完成了。

  • 由于是自签名证书,默认是不受Docker信任的,故而需要将证书添加到Docker的根证书中,Docker在CentOS 7中,证书存放路径是/etc/docker/certs.d/域名

node1 端:

  1. mkdir -p /etc/docker/certs.d/reg.itmuch.com
  2. cp ~/certs/reg.itmuch.com.crt /etc/docker/certs.d/reg.itmuch.com/

node0 端:将生成的证书下载到根证书路径

  1. mkdir -p /etc/docker/certs.d/reg.itmuch.com
  2. scp root@192.168.11.144:/root/certs/reg.itmuch.com.crt /etc/docker/certs.d/reg.itmuch.com/
  • 重新启动node0node1 的Docker
  1. service docker restart
  • node1 上启动私有仓库

首先切换到家目录中,这一步不能少,原因是下面的-v 挂载了证书,如果不切换,将会引用不到证书文件。

  1. cd ~

启动Docker私有仓库(注意:如果直接粘贴运行,请删除掉注释):

  1. docker run -d -p 443:5000 --restart=always --name registry \
  2. -v `pwd`/certs:/certs \ # 将“当前目录/certs”挂载到容器的“/certs
  3. -v /opt/docker-image:/opt/docker-image \
  4. -e STORAGE_PATH=/opt/docker-image \ # 指定容器内存储镜像的路径
  5. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/reg.itmuch.com.crt \ # 指定证书文件
  6. -e REGISTRY_HTTP_TLS_KEY=/certs/reg.itmuch.com.key \ # 指定key文件
  7. registry:2

其中,之所以挂载/opt/docker-image目录,是为了防止私有仓库容器被删除,私有仓库中的镜像也会丢失。

  • node0 上测试,将镜像push到私服
  1. docker pull kitematic/hello-world-nginx
  2. docker tag kitematic/hello-world-nginx reg.itmuch.com/kitematic/hello-world-nginx # 为本地镜像打标签
  3. docker push reg.itmuch.com/kitematic/hello-world-nginx # 将镜像push到私服

会发现如下内容:

  1. The push refers to a repository [reg.itmuch.com/kitematic/hello-world-nginx]
  2. 5f70bf18a086: Pushed
  3. b51acdd3ef48: Pushed
  4. 3f47ff454588: Pushed
  5. ....
  6. latest: digest: sha256:d3e1883b703c39556f2f09da14cc3b820f69a43436655c882c0c0ded0dda6a4b size: 3226

说明已经push成功。

  • 从私服中下载镜像:
  1. docker pull reg.itmuch.com/kitematic/hello-world-nginx

配置登录认证

在很多场景下,我们需要用户登录后才能访问私有仓库,那么我们可以如下操作:

建立在上文生成证书,同时重启过Docker服务的前提下,我们讲解一下如何配置:

  • 为防止端口冲突,我们首先删除或停止之前启动好的私有仓库:
  1. docker kill registry
  • 在node1机器上安装httpd-tools
  1. yum install httpd-tools
  • 在node机器上创建密码文件,并添加一个用户testuser ,密码是testpassword
  1. cd ~
  2. mkdir auth
  3. htpasswd -Bbn testuser testpassword > auth/htpasswd
  • 在node1机器上切换到~ 目录,并启动私有仓库(注意:如果直接粘贴运行,请删除掉注释):
  1. docker run -d -p 443:5000 --restart=always --name registry2 \
  2. -v /opt/docker-image:/var/lib/registry \ # 挂载容器内存储镜像路径到宿主机
  3. -v `pwd`/certs:/certs \
  4. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/reg.itmuch.com.crt \
  5. -e REGISTRY_HTTP_TLS_KEY=/certs/reg.itmuch.com.key \
  6. -v `pwd`/auth:/auth \
  7. -e "REGISTRY_AUTH=htpasswd" \
  8. -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  9. -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  10. registry:2
  • 测试:
  1. docker push reg.itmuch.com/kitematic/hello-world-nginx

提示:

  1. 461f75075df2: Image push failed
  2. no basic auth credentials

说明需要认证。

我们登陆一下,执行:

  1. docker login reg.imuch.com

再次执行

  1. docker push reg.itmuch.com/kitematic/hello-world-nginx

就可以正常push镜像到私有仓库了。

注意:如果想要从私有仓库上下载镜像,同样需要登录。

参考文档:

官方文档:https://docs.docker.com/registry/deploying/#/running-a-domain-registry

Docker Registry V2 htpasswd认证方式搭建:http://www.tuicool.com/articles/vMZZveM

Docker Registry V2搭建:http://www.tuicool.com/articles/6jEJZj

Docker Registry V2搭建:http://tomhat.iteye.com/blog/2304098

Docker Registry V1搭建:http://blog.csdn.net/wsscy2004/article/details/26279569

非认证的Docker Registry V1搭建:http://blog.csdn.net/wangtaoking1/article/details/44180901

带认证的Docker Registry V1搭建:http://snoopyxdy.blog.163.com/blog/static/601174402015823741997/

Docker专题汇总:http://www.zimug.com/360.html

Docker疑难解答:https://segmentfault.com/q/1010000000938076